fn main() {
    /*
     * 迭代器模式: 对一系列项执行某些行为
     * 迭代器负责
     *  - 遍历每个项
     *  - 确定序列(遍历)何时完成
     *  Rust迭代器
     *   - 懒惰的：除非调用消费迭代器的方法，否则迭代器本身没有任何效果
     */

    // let v1 = vec![1, 2, 3];

    // // 创建一个迭代器
    // let v1_iter = v1.iter();

    // for val in v1_iter {
    //     println!("v1_item:{}",val);
    // }

    // 所有的迭代器都实现了Iterator trait
    // 定义于标准库
    // type item 和 Self::item定义了与此该trait关联的类型
    //  - 实现Iterator trait 需要你定义一个item类型，它用于next方法的返回类型（迭代器的返回类型）
    //  - 需要实现一个方法next
    //     - 每次返回迭代器中的一项
    //     - 返回结果包裹在Some里
    //     - 迭代结束返回None
    //  可直接在迭代器上调用next方法

    // 迭代方法
    // iter：在不可变应用上创建迭代器
    // into_iter：创建的迭代器会获得所有权
    // iter_mut: 迭代可变的引用

    let v1 = vec![1, 2, 3];

    let v1_iter = v1.iter();
    let total: i32 = v1_iter.sum(); // 获取v1_iter的所有权

    // println!("v1_iter: {:?}",v1_iter);// 不能使用v1_iter
    println!("total: {}", total);
    // assert_eq!(v1_map.next(), Some(2));
}

#[cfg(test)]

mod test {
    #[test]
    fn map_demo() {
        let v1 = vec![1, 2, 3];

        let v1_iter = v1.iter();
        // let total:i32 = v1_iter.sum(); // 获取v1_iter的所有权
        let mut v1_map = v1_iter.map(|x| x + 1);

        // println!("v1_iter: {:?}",v1_iter);// 不能使用v1_iter
        // println!("total: {}",total);
        assert_eq!(v1_map.next(), Some(2));
    }

    
}
